package com.sky.service;

import com.sky.dto.*;
import com.sky.result.PageResult;
import com.sky.vo.OrderPaymentVO;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;

public interface OrderService {
    /**
     * 用户下单
     */
    OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO);

    /**
     * 订单支付
     * @param ordersPaymentDTO
     * @return
     */
    OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception;

    /**
     * 支付成功，修改订单状态
     * @param outTradeNo
     */
    void paySuccess(String outTradeNo);


    /**
     * 历史订单分页查询
     * 订单状态： 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
     */
    PageResult pageQueryUser(int page, int pageSize, Integer status);

    /**
     * 查询订单详情页面
     */
    OrderVO getOrderDetailsById(Long id);

    /**
     * 用户取消订单
     */
    void userCancelById(Long id) throws Exception;


    /**
     * 订单详情上的再来一单
     * 再来一单就是将原订单中的商品重新加入到购物车中
     */
    void repetition(Long id);



    //-----------管理端订单接口----------------------
    /**
     * 订单分页条件查询
     */
    PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 各个状态的订单数量统计
     */
    OrderStatisticsVO statistics();

    /**
     * 接单(已付款的订单)
     */
    void confirm(OrdersConfirmDTO ordersConfirmDTO);

    /**
     * 商家拒单(已付款的订单) 只有订单处于“待接单”状态时可以执行拒单操作
     * 商家拒单其实就是将订单状态修改为“已取消”
     * 商家拒单时需要指定拒单原因
     * 商家拒单时，如果用户已经完成了支付，需要为用户退款
     */
    void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception;

    /**
     * 商家取消订单 将订单状态修改为“已取消”
     * 商家取消订单时需要指定取消原因
     * 商家取消订单时，如果用户已经完成了支付，需要为用户退款
     * 功能类似上面：商户拒单
     */
    void cancel(OrdersCancelDTO ordersCancelDTO)  throws Exception;

    /**
     * 商户端派送订单 就是将订单状态修改为“派送中”
     * 只有状态为“待派送”的订单可以执行派送订单操作
     */
    void deliveryById(Long id);

    /**
     * 商户端完成订单 就是将订单状态修改为“已完成” 5
     * 只有状态为“派送中 4”的订单可以执行订单完成操作
     */
    void complete(Long id);

    /**
     * 客户催单
     */
    void reminder(Long id);
}
